/**
 * @file drv_pwm.c
 * @brief HAL CUBEMX DRIVER
 * 
 * @author dalin (dalin@open-robot.com)
 * @version 1.0
 * @date 2023-05-10
 * 
 * @copyright Copyright (c) 2023  Open Robot Tech.co, Ltd
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2023-05-10 <td>1.0     <td>dalin     <td>初始化
 * </table>
 */

#include "drv_tim_pwm.h"
#ifdef USE_TIM_PWM_DRIVER
#include "tim.h"
#include "mlog.h"



/**
 * @brief 启动定时器对应通道
 * 
 * @param  tim              : tim编号（timNumber_e）
 * @param  channel          : 指定通道 （timChannel_e）
 * 
 * @return int 成功：DRV_EOK  失败：其他
 */
int drv_tim_pwm_start(timNumber_e tim, timChannel_e channel)
{
    TIM_HandleTypeDef *handle;
    uint32_t ch;

    handle = get_tim_handle(tim);
    if(handle == NULL)
    {
        return DRV_ERROR;
    }
    ch = get_tim_channel(channel);

    /* PWM启动函数 */
    HAL_TIM_PWM_Start(handle, ch);

    return DRV_EOK;
}


/**
 * @brief 停止定时器对应通道
 * 
 * @param  tim              : tim编号（timNumber_e）
 * @param  channel          : 指定通道 （timChannel_e）
 * 
 * @return int 成功：DRV_EOK  失败：其他
 */
int drv_pwm_stop(timNumber_e tim, timChannel_e channel)
{
    TIM_HandleTypeDef *handle;
    uint32_t ch;

    handle = get_tim_handle(tim);
    if(handle == NULL)
    {
        return DRV_ERROR;
    }
    ch = get_tim_channel(channel);
    
    /* PWM停止函数 */
    HAL_TIM_PWM_Stop(handle, ch);

    return DRV_EOK;
}


/**
 * @brief 设置定时器对应通道
 * 
 * @param  tim              : tim编号（timNumber_e）
 * @param  channel          : 指定通道 （timChannel_e）
 * @param  duty             : 占空比
 * 
 * @return int 成功：DRV_EOK  失败：其他
 */
int drv_pwm_set_dutycycle(timNumber_e tim, timChannel_e channel, uint32_t duty)
{
    TIM_HandleTypeDef *handle;
    uint32_t ch;

    handle = get_tim_handle(tim);
    if(handle == NULL)
    {
        return DRV_ERROR;
    }
    ch = get_tim_channel(channel);

    /* 占空比 */
    __HAL_TIM_SET_COMPARE(handle, ch, duty);

    return DRV_EOK;
}


/**
 * @brief 设置周期（自动重装载值）
 * 
 * @param  tim              : tim编号（timNumber_e）
 * @param  period           : 设定周期
 * 
 * @return int 成功：DRV_EOK  失败：其他
 */
int drv_pwm_set_autoreload(timNumber_e tim, uint32_t period)
{
    TIM_HandleTypeDef *handle;

    handle = get_tim_handle(tim);
    if(handle == NULL)
    {
        return DRV_ERROR;
    }

    /* 周期 */
    __HAL_TIM_SET_AUTORELOAD(handle, period);

    return DRV_EOK;
}

#endif /* USE_TIM_PWM_DRIVER */
